import java.util.Queue;
import java.util.concurrent.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2023-12-24
 * Time: 14:41
 */

// ==============阻塞队列=====================
public class T3 {
    public static void main(String[] args) throws InterruptedException {
        /**
         * 当阻塞队列是空时，从队列中获取元素的操作将会被阻塞。
         * 当阻塞队列是满时，往队列里添加元素的操作将会被阻塞。
         *
         * 自动 wait 和 notify，程序员不必手动控制
         */
//        // 第一组，抛出异常组
//        // add 和 remove，element
//        // 指定容量为 3
//        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
//        System.out.println(blockingQueue.add("a"));
//        System.out.println(blockingQueue.add("b"));
//        System.out.println(blockingQueue.add("c"));
//
//        // 添加第 4 个
////        blockingQueue.add("d");
//        /**
//         *
//         * Exception in thread "main" java.lang.IllegalStateException: Queue full
//         */
//
//        // 判断队列是否为 null（抛异常），不空返回队首元素，但不删除
//        System.out.println(blockingQueue.element());
//
//        // 队列，先进先出
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//
//         //无元素
//        System.out.println(blockingQueue.remove());
//        /**
//         * Exception in thread "main" java.util.NoSuchElementException
//         */


        // 第二组，返回特殊值
        // offer，poll，peek
//        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
//        System.out.println(blockingQueue.offer("a"));
//        System.out.println(blockingQueue.offer("b"));
//        System.out.println(blockingQueue.offer("c"));
//
//        System.out.println(blockingQueue.peek());
//
//
//        System.out.println(blockingQueue.offer("d"));
//        /**
//         * false
//         */
//
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//
//        System.out.println(blockingQueue.poll());
        /**
         * null
         */

        // 第三组，阻塞（无返回值）
        // put，take
//        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
//        blockingQueue.put("a");
//        blockingQueue.put("b");
//        blockingQueue.put("c");
//
////        blockingQueue.put("d");
//        /**
//         * 一直卡住，直到有其他线程取出
//         */
//
//        blockingQueue.take();
//        blockingQueue.take();
//        blockingQueue.take();


//        blockingQueue.take();
        /**
         * 一直卡住，直到有其他线程放入新的元素
         */

        // 第四组，有的等待时间
        // 过时不候
//        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
//        System.out.println(blockingQueue.offer("a", 2L, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.offer("b", 2L, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.offer("c", 2L, TimeUnit.SECONDS));
//
//
////        System.out.println(blockingQueue.offer("d", 2L, TimeUnit.SECONDS));
//        /**
//         * 等待两秒后，直接返回 false
//         */
//
//        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
//
//
//        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
/**
 *      等待两秒。返回 null
 *
 */


        /**
         * SynchronousQueue
         * 容量只有 1，放入后必须取出才能继续使用，否则一直阻塞
         * 不存储，产生一个消费一个
         */
//        BlockingQueue<String> synchronousQueue = new SynchronousQueue<>();
//
//        new Thread(() -> {
//            System.out.println(Thread.currentThread().getName() + "\tput 1");
//            try {
//                synchronousQueue.put("1");
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//
//            System.out.println(Thread.currentThread().getName() + "\tput 2");
//            try {
//                synchronousQueue.put("2");
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//
//            System.out.println(Thread.currentThread().getName() + "\tput 3");
//            try {
//                synchronousQueue.put("3");
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }, "AAA").start();
//
//
//        new Thread(() -> {
//            try {
//                Thread.sleep(3000);
//                System.out.println(Thread.currentThread().getName() + "\tget " + synchronousQueue.take());
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//
//            try {
//                Thread.sleep(3000);
//                System.out.println(Thread.currentThread().getName() + "\tget " + synchronousQueue.take());
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//
//            try {
//                Thread.sleep(3000);
//                System.out.println(Thread.currentThread().getName() + "\tget " + synchronousQueue.take());
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }, "BBB").start();



    }
}
